package models

import (
	"go.didapinche.com/time"
)

const (
	GraphTableName = "t_graph"
)

type Graph struct {
	ID         uint64 `gorm:"primary_key,column:id" json:"id"`
	Name       string `gorm:"column:name" json:"name"`
	TemplateId uint64 `gorm:"column:template_id"  json:"template_id"` //模版id
	//
	AppID       uint64 `gorm:"column:app_id" json:"app_id,omitempty" form:"app_id"`
	ApiID       uint64 `gorm:"column:api_id" json:"api_id,omitempty" form:"api_id"`
	HostID      uint64 `gorm:"column:host_id" json:"host_id,omitempty" form:"host_id"`
	DashboardID uint64 `gorm:"column:dashboard_id" json:"dashboard_id" form:"dashboard_id"`
	//todo
	TypeID uint64 `gorm:"column:type_id" json:"type_id"` //模版分类ID，
	//todo kind，type规范
	Kind          GraphKind      `gorm:"column:kind"`               //种类
	Order         int            `gorm:"column:order" json:"order"` //排序
	Queries       Queries        `gorm:"type:json;column:queries" json:"queries"`
	Visualization *Visualization `gorm:"type:json;column:visualization" json:"visualization"` // 可视化
	Alert         *Alert         `gorm:"type:json;column:alert" json:"alert,omitempty"`
	IsForce       bool           `gorm:"column:is_force" json:"is_force"` // 强制订阅
	Level         int            `gorm:"column:level" json:"level"`
	CreateTime    time.Time      `gorm:"<-:create;column:create_time" json:"create_time"`
	UpdateTime    time.Time      `gorm:"column:update_time" json:"update_time"`
	Silence       *Silence       `gorm:"type:json;column:silence" json:"silence"`
	Subscribe     *Subscribe     `gorm:"type:json;column:subscribe" json:"subscribe"`
	General       *General       `gorm:"type:json;column:general" json:"general"`
	Status        int            `gorm:"-" json:"status"` //
	// todo
	Kind2     string  `gorm:"-" json:"kind"`      //种类
	Threshold float64 `json:"threshold" gorm:"-"` // 阈值
	AppName   string  `gorm:"-" json:"app_name"`
	ApiInfo   *Api    `gorm:"-" json:"api_info"`
}

type Subscribe struct {
	Phones         []string        `json:"user_ids"`
	Sms            []string        `json:"sms"`
	SubscribeForce []SubscribeType `json:"subscribe_force"`
}

func (Graph) TableName() string {
	return GraphTableName
}

type GraphAndType struct {
	ID            uint64         `gorm:"primary_key,column:id" json:"id"`
	Name          string         `gorm:"column:name" json:"name"`
	TemplateId    uint64         `gorm:"column:template_id"  json:"template_id"` //模版id
	AppID         uint64         `gorm:"column:app_id" json:"app_id,omitempty" form:"app_id"`
	ApiID         uint64         `gorm:"column:api_id" json:"api_id,omitempty" form:"api_id"`
	HostID        uint64         `gorm:"column:host_id" json:"host_id,omitempty" form:"host_id"`
	DashboardID   uint64         `gorm:"column:dashboard_id" json:"dashboard_id" form:"dashboard_id"`
	TypeID        uint64         `gorm:"column:type_id" json:"type_id"`     //模版分类ID
	Type_Name     string         `gorm:"column:type_name" json:"type_name"` //模版分类ID
	Kind          GraphKind      `gorm:"column:kind" json:"kind"`           //种类
	General       *General       `gorm:"type:json;column:general" json:"general"`
	Order         int            `gorm:"column:order" json:"order"`
	Order2        int            `gorm:"column:order2" json:"order2"` //模版分类排序
	Queries       Queries        `gorm:"type:json;column:queries" json:"queries"`
	Visualization *Visualization `gorm:"type:json;column:visualization" json:"visualization"` // 可视化
	Alert         *Alert         `gorm:"type:json;column:alert" json:"alert,omitempty"`
	IsForce       bool           `gorm:"column:is_force" json:"is_force"` // 强制订阅
	Key           string         `gorm:"column:key" json:"key"`
	Level         int            `gorm:"column:level" json:"level"`
	CreateTime    time.Time      `gorm:"<-:create;column:create_time" json:"create_time"`
	UpdateTime    time.Time      `gorm:"column:update_time" json:"update_time"`
	Silence       *Silence       `gorm:"type:json;column:silence" json:"silence"`
	Subscribe     *Subscribe     `gorm:"type:json;column:subscribe" json:"subscribe"`
	Expand        bool           `gorm:"column:expand" json:"default_expand" form:"default_expand"`
	Status        int            `gorm:"-" json:"status"`
	UserID        string         `gorm:"-" json:"user_id"`
	IsOwner       bool           `gorm:"-" json:"id_owner"`
}

//声明一个Hero结构体切片类型
type GraphAndTypeSlice []*GraphAndType

//切片实现Interface 接口的三个方法
//1.Len() ：返回切片的大小
func (m GraphAndTypeSlice) Len() int {
	return len(m)
}

//2.Less(i, j int) :决定使用什么规则进行排序
func (m GraphAndTypeSlice) Less(i, j int) bool {
	return m[i].Order2 < m[j].Order2
}

//3.Swap(i, j int) :Less(i, j int)返回true时进行交换
func (m GraphAndTypeSlice) Swap(i, j int) {
	m[i], m[j] = m[j], m[i]
}

type General struct {
	Yaxes Yaxes `json:"yaxes"`
}
type Yaxes struct {
	Format   UnitType `json:"format"`
	Decimals int      `json:"decimals"`
}
